# ================================================#
#             Replication files for:              #
#   "The Legacy of Multi-Dimensional Conflict"    #
#         Joan Barceló and Leonid Peisakhin       #
#          Comparative Political Studies          #
#          Last updated: August 29, 2025          #
# ================================================#

# Replication files prepared using: "R version 4.2.3 (2023-03-15)"#

# ------------------#
# ------------------#
#   APPENDIX A.1    #
# ------------------#
# ------------------#

rm(list = ls())

# -------------------------------
# Libraries
# -------------------------------
library(readtext)
library(dplyr)
library(stringr)
library(quanteda)
library(keyATM)
library(ggplot2)


# -------------------------------
# Load data
# -------------------------------

PATH <- ''

filelist <- list.files(path = PATH, recursive = TRUE,
                       pattern = "\\.txt$", full.names = TRUE)

df <- data.frame(title = basename(filelist), content = NA_character_)

for (i in seq_along(filelist)) {
  df$content[i] <- readtext(filelist[i], encoding = "macintosh")$text
}

df$title   <- gsub(".txt", "", df$title)
df$title   <- gsub("_AB", "", df$title)
df$content <- gsub("\n", " ", df$content)

df$year    <- substr(df$title, 1, 4)

stopwords1 <- "a, abans, abans-d ahir, abintestat, ací, adesiara, adés, adéu, adàgio, ah, ahir, ai, aitambé, aitampoc, aitan, aitant, aitantost, 
aixà, això, així, aleshores, algun, alguna, algunes, alguns, algú, alhora, allà, allèn, allò, allí, almenys, alto, altra, altre, altres, 
altresí, altri, alça, al·legro, amargament, amb, ambdues, ambdós, amunt, amén, anc, andante, andantino, anit, ans, antany, apa, aprés, aqueix, 
aqueixa, aqueixes, aqueixos, aqueixs, aquell, aquella, aquelles, aquells, aquest, aquesta, aquestes, aquests, aquèn, aquí, ara, arran, arrera, 
arrere, arreu, arri, arruix, atxim, au, avall, avant, aviat, avui, açò, bah, baix, baldament, ballmanetes, banzim-banzam, bastant, bastants, ben, bis, 
bitllo-bitllo, bo, bé, ca, cada, cal, cap, car, caram, catorze, cent, centes, cents, cerca, cert, certa, certes, certs, cinc, cinquanta, cinquena, 
cinquenes, cinquens, cinquè, com, comsevulla, contra, cordons, corrents, cric-crac, d, daixonses, daixò, dallonses, dallò, dalt, daltabaix, damunt, 
darrera, darrere, davall, davant, de, debades, dedins, defora, dejorn, dejús, dellà, dementre, dempeus, demés, demà, des, desena, desenes, desens, 
després, dessobre, dessota, dessús, desè, deu, devers, devora, deçà, diferents, dinou, dins, dintre, disset, divers, diversa, diverses, diversos, 
divuit, doncs, dos, dotze, dues, durant, ecs, eh, el, ela, elis, ell, ella, elles, ells, els, em, emperò, en, enans, enant, encara, encontinent, 
endalt, endarrera, endarrere, endavant, endebades, endemig, endemés, endemà, endins, endintre, enfora, engir, enguany, enguanyasses, enjús, enlaire, 
enlloc, enllà, enrera, enrere, ens, ensems, ensota, ensús, entorn, entre, entremig, entretant, entrò, envers, envides, environs, enviró, ençà, ep, 
ep, era, eren, eres, ergo, es, escar, essent, esser, est, esta, estada, estades, estan, estant, estar, estaran, estarem, estareu, estaria, estarien, 
estaries, estaré, estarà, estaràs, estaríem, estaríeu, estat, estats, estava, estaven, estaves, estem, estes, esteu, estic, estiguem, estigueren, 
estigueres, estigues, estiguessis, estigueu, estigui, estiguin, estiguis, estigué, estiguérem, estiguéreu, estigués, estiguí, estos, està, estàs, 
estàvem, estàveu, et, etc, etcètera, ets, excepte, fins, fora, foren, fores, força, fos, fossin, fossis, fou, fra, fui, fóra, fórem, fóreu, fóreu, 
fóssim, fóssiu, gaire, gairebé, gaires, gens, girientorn, gratis, ha, hagi, hagin, hagis, haguda, hagudes, hagueren, hagueres, haguessin, haguessis, 
hagut, haguts, hagué, haguérem, haguéreu, hagués, haguéssim, haguéssiu, haguí, hala, han, has, hauran, haurem, haureu, hauria, haurien, hauries, hauré, 
haurà, hauràs, hauríem, hauríeu, havem, havent, haver, haveu, havia, havien, havies, havíem, havíeu, he, hem, heu, hi, ho, hom, hui, hàgim, hàgiu, i, 
igual, iguals, inclusive, ja, jamai, jo, l, la, leri-leri, les, li, lla, llavors, llevat, lluny, llur, llurs, lo, los, ls, m, ma, mai, mal, malament, 
malgrat, manco, mant, manta, mantes, mantinent, mants, massa, mateix, mateixa, mateixes, mateixos, me, mentre, mentrestant, menys, mes, meu, meua, meues, 
meus, meva, meves, mi, mig, mil, mitges, mitja, mitjançant, mitjos, moixoni, molt, molta, moltes, molts, mon, mos, més, n, na, ne, ni, ningú, no, nogensmenys, 
només, noranta, nos, nosaltres, nostra, nostre, nostres, nou, novena, novenes, novens, novè, ns, nòs, nós, o, oh, oi, oidà, on, onsevulga, onsevulla, 
onze, pas, pengim-penjam, per, perquè, pertot, però, piano, pla, poc, poca, pocs, poques, potser, prest, primer, primera, primeres, primers, pro, prompte, 
prop, prou, puix, pus, pàssim, qual, quals, qualsevol, qualsevulla, qualssevol, qualssevulla, quan, quant, quanta, quantes, quants, quaranta, quart, quarta, 
quartes, quarts, quasi, quatre, que, quelcom, qui, quin, quina, quines, quins, quinze, quisvulla, què, ran, re, rebé, renoi, rera, rere, res, retruc, s, sa, 
salvament, salvant, salvat, se, segon, segona, segones, segons, seguida, seixanta, sempre, sengles, sens, sense, ser, seran, serem, sereu, seria, serien, 
series, seré, serà, seràs, seríem, seríeu, ses, set, setanta, setena, setenes, setens, setze, setè, seu, seua, seues, seus, seva, seves, si, sia, siau, sic, 
siguem, sigues, sigueu, sigui, siguin, siguis, sinó, sis, sisena, sisenes, sisens, sisè, sobre, sobretot, sol, sola, solament, soles, sols, som, son, sos, sota, 
sots, sou, sovint, suara, sí, sóc, són, t, ta, tal, tals, també, tampoc, tan, tanmateix, tant, tanta, tantes, tantost, tants, te, tercer, tercera, terceres, 
tercers, tes, teu, teua, teues, teus, teva, teves, ton, tos, tost, tostemps, tot, tota, total, totes, tothom, tothora, tots, trenta, tres, tret, tretze, tu, 
tururut, u, uf, ui, uix, ultra, un, una, unes, uns, up, upa, us, va, vagi, vagin, vagis, vaig, vair, vam, van, vares, vas, vau, vem, verbigràcia, vers, vet, 
veu, vint, vora, vos, vosaltres, vostra, vostre, vostres, vostè, vostès, vuit, vuitanta, vuitena, vuitenes, vuitens, vuitè, vés, vàreig, vàrem, vàreu, vós, 
xano-xano, xau-xau, xec, érem, éreu, és, ésser, àdhuc, àlies, ça, ço, òlim, ídem, últim, última, últimes, últims, únic, única, únics, úniques"

stopwords1 <- strsplit(stopwords1, ",")[[1]]

for (i in 1:length(stopwords1)){
  stopwords1[i] <- str_trim(stopwords1[i])
}

stopwords2 <- "prop, ningú, vagin, pas, quelcom, estigueres, primera, altres, estaré, verbigràcia, tene, mitjos, feu, seré, aquestes, estàs, desè,
potser, ensús, estigueren, siguis, mitjançant, cents, hi, quantes, te, hagis, hauríem, enjús, tantes, corrents, total, aquell, estan, 
enrere, up, fan, estàveu, ta, sens, més, estiguéreu, tenir, últimes, entretant, arran, avui, davant, enrera, cordons, us, he, 
saber, seves, teniu, sola, vam, sabeu, estar, alguna, teues, enguanyasses, úniques, nostra, ençà, aquí, serien, aqueixes, sobretot, 
fóssim, aleshores, sovint, anar, vàreig, sisenes, vers, devora, diferents, ahir, nogensmenys, adés, rebé, estiguérem, sota, aquests, 
hagut, estes, lo, fos, siguem, hagin, aitan, allí, segones, quals, dins, ja, aqueixos, est, endebades, estem, novenes, puix, vagis, 
divuit, ambdues, setè, estats, cinc, fóssiu, etc, ls, sigui, iguals, tenim, suara, certa, vostres, daixonses, des, de, ah, mant, retruc,
aqueix, un, haguessin, seguida, excepte, ça, enllà, la, salvant, novens, diversa, bastant, segons, uf, saben, dues, tots, ui, hauràs, 
arreu, sabem, algunes, soles, m, estada, quinze, quant, estàvem, comsevulla, diversos, han, esteu, havent, prompte, mantinent, ma, jo, 
s, baix, hàgiu, unes, dallò, setze, mitja, estic, des, tants, vostre, aitantost, estaven, cada, sols, pàssim, ni, dos, amunt, tost, dejorn, 
novena, estant, segon, ells, mateix, res, t, sinó, fou, com, alguns, només, ha, qualsevol, tu, vostra, damunt, tota, encontinent, inclusive, 
ton, haveu, contra, cal, mal, entremig, entrò, aqueixa, entre, endemig, ets, estades, per, abintestat, sí, prou, terceres, vuitanta, 
estarien, durant, seues, setenes, na, dementre, aquesta, renoi, dessota, ella, conseguim, hagudes, tes, enguany, vaig, uix, endemà, 
lluny, algun, haver, mants, algú, setens, sots, açò, seus, foren, au, n, mateixes, siau, aqueixs, aquèn, menys, vem, vuitens, únic, 
tothom, vora, me, girientorn, tot, car, mitges, una, se, cap, seva, vas, bastants, manta, vares, rere, darrere, conseguir, estiguis, 
llarg, certs, fóreu, nostres, seríeu, setena, haguda, rera, seua, està, fórem, l, arri, deu, mi, haguts, andantino, éssent, on, banzim-banzam, 
darrera, envides, fossis, centes, cinquè, nou, estos, endins, elles, quan, enviró, piano, ensems, i, sobre, fossin, seríem, tantost, 
aquest, quarts, vuitenes, consigueixen, moltes, era, dedins, qualssevulla, nós, anit, malament, estaves, hagi, ús, sempre, havem, 
entorn, disset, consigueix, dintre, xau-xau, altri, estaries, altra, llurs, quins, adàgio, ns, el, bastant, fas, bo, teu, ai, hagué, 
haurien, fores, llur, tal, hauríeu, sengles, sis, ben, tretze, estigués, saps, hui, vair, eh, estiguessis, fins, haguí, quartes, hom, 
hauria, qual, tinc, mateixos, series, oh, vos, ses, alça, debades, endintre, mos, hauran, xec, poc, pro, arruix, vuitena, mode, essent, 
jamai, quin, xano-xano, estigué, aquells, tercer, sigueu, aitambé, sic, àlies, quines, què, sigues, sense, baldament, endalt, fra, qualsevulla, 
haguéssiu, tanmateix, ela, meu, dessobre, cent, ens, ambdós, dalt, vuit, tan, estiguí, gairebé, hauré, teus, som, son, les, hala, ep, 
tres, es, dem anc, vuitè, quisvulla, et, dejús, després, en, consigueixes, onsevulga, em, aixà, aitampoc, per, que, deçà, endavant, 
haguéssim, onsevulla, quarta, amargament, bitllo-bitllo, encara, òlim, sou, caram, dempeus, vet, has, devers, aitant, alto, tampoc, 
hàgim, altresí, dinou, cinquanta, cinquens, meua, haguérem, ran, nosaltres, llevat, nòs, siguin, ans, sóc, seixanta, haureu, soc, 
primeres, estava, però, ell, enlaire, ensota, esser, estaríeu, poden, cinquenes, o, re, pertot, havia, tret, sap, teva, quants, 
això, allà, tothora, trenta, fa, sia, pla, haurà, mes, fer, faig, dellà, vagi, quart, arrere, podem, van, molts, dotze, aquelles, amb, 
serem, molt, meus, noranta, sol, u, meva, onze, arrera, quina, ne, estigui, daixò, havien, gratis, estarem, oi, esta, set, envers, teves, 
haguéreu, gaires, sos, éreu, catorze, endemés, davall, vosaltres, àdhuc, gaire, haurem, aquella, sisena, daltabaix, enant, fi, mai, 
érem, primers, poder, els, escar, enans, perquè, pengim-penjam, pocs, allèn, últims, emperò, sereu, mantes, vàreu, demà, antany, estigueu, 
quatre, desenes, avant, ballmanetes, environs, estareu, podeu, teua, vau, malgrat, així, estaran, gens, puc, estaríem, upa, etcètera, 
vós, aviat, tanta, veu, mentre, segona, estaràs, desens, heu, salvat, doncs, sisens, són, bah, qualssevol, fui, ca, d, única, mateixa, 
meves, havies, vàrem, mentrestant, leri-leri, va, cinquena, serà, és, quaranta, fóra, ecs, si, abans, ahir, totes, tururut, sa, estaria, 
seu, endarrere, cerca, estiguem, adesiara, estarà, divers, abans, avall, desena, solament, força, molta, apa, cert, amén, pus, aprés, 
tercers, enlloc, setanta, ser, quanta, oidà, nos, novè, qui, allò, lla, los, sisè, havíeu, endarrera, moixoni, hem, estigues, consegueixo, 
que, vostè, cric, crac, mil, manco, quasi, hauries, seria, certes, a, prest, poca, andante, primer, tals, almenys, mig, últim, ésser, 
ho, ergo, diverses, mon, havíem, també, ací, tostemps, li, tercera, ara, únics, tos, seran, bis, vostès, fem, vés, igual, massa, 
hagueres, demés, inclòs, vint, defora, eren, ultra, tant, dessús, hagués, uns, estat, estiguin, salvament, hagueren, adéu, ídem, última, 
llavors, elis, altre, poques, alhora, dallonses, nostre, engir, meues, al·legro, eres, atxim, ço, erem, fora, enfora, seràs, haguessis"

stopwords2 <- strsplit(stopwords2, ",")[[1]]

for (i in 1:length(stopwords2)){
  stopwords2[i] <- str_trim(stopwords2[i])
}

stopwords3 <- "de, es, i, a, o, un, una, unes, uns, un, tot, també, altre, algun, alguna, alguns, algunes, ser, és, soc, ets, som, estic, està, 
estem, esteu, estan, com, en, per, perquè, per, que, estat, estava, ans, abans, éssent, ambdós, però, per, poder, potser, puc, podem, podeu, poden, 
vaig, va, van, fer, faig, fa, fem, feu, fan, cada, fi, inclòs, primer, des, de, conseguir, consegueixo, consigueix, consigueixes, conseguim, 
consigueixen, anar, haver, tenir, tinc, te, tenim, teniu, tene, el, la, les, els, seu, aquí, meu, teu, ells, elles, ens, nosaltres, vosaltres, 
si, dins, sols, solament, saber, saps, sap, sabem, sabeu, saben, últim, llarg, bastant, fas, molts, aquells, aquelles, seus, llavors, sota, dalt, 
ús, molt, era, eres, erem, eren, mode, bé, quant, quan, on, mentre, qui, amb, entre, sense, jo, aquell"

stopwords3 <- strsplit(stopwords3, ",")[[1]]

for (i in 1:length(stopwords3)){
  stopwords3[i] <- str_trim(stopwords3[i])
}

stopwords4 <- "caldre, gran, veure, voler, parlar, manera, veure, moment, clar, vegada, tema, voler, donar, punt, important, creure, president, 
senyor, candidat, cosa, dels, pels, volem, crec, coses, exemple, vegades, cambra"

stopwords4 <- strsplit(stopwords4, ",")[[1]]

for (i in 1:length(stopwords4)){
  stopwords4[i] <- str_trim(stopwords4[i])
}

stopwords5 <- "senyors, senyores, miri, mica, veus, nova, general, banda, vista, temes, evidentment, vull, part, anys, política,
programa, partit, llei, generalitat, govern, societat, polític, europa, tema, acció, problema, objectiu, 
través, camp, bona, intervenció, institucions, legislatura, proposta, veritat, suport, pacte, persones, eleccions,
deia, temps, grup, model, convergència, millor, sembla, gràcies, ciutadans, tenen, debat, parlament,
diputats, gent acord, govern, acord, gent, majoria, investidura, discurs, passat, popular, sentit, electoral,
polítiques, presidència, fons, tingut, posar, volen, creiem, moments, camí, farem, escolti, lleis, mesos,
condicions, marc, sector, realitat, forces, tipus, grans, podria, precisament, línia, situació, lloc,
nivell, polítiques, estatut, futur, milions, referència, vida, europea, voldria, diguem-ne, podríem,
base, consell, resta, fer-ho, partits, paraules, diuen, parlamentari, forma, absolutament"

stopwords5 <- strsplit(stopwords5, ",")[[1]]

for (i in 1:length(stopwords5)){
  stopwords5[i] <- str_trim(stopwords5[i])
}

df$speaker <- sapply(strsplit(df$title, "-"), function(x) {
  paste(x[3:length(x)], collapse = "-")
})
df$speaker <- gsub("-[0-9]+$", "", df$speaker)

stopwords6 <- unlist(strsplit(df$speaker, " "))

stopwords <- c(stopwords1, stopwords2, stopwords3, stopwords4, stopwords5
               , stopwords6
               )
stopwords <- unique(stopwords)

df$content <- gsub("'", " ", df$content)
df$content <- gsub("’", " ", df$content)
df$content <- gsub("\\.", " . ", df$content)
df$content <- gsub(",", " , ", df$content)

corpus <- corpus(df$content)

tokens_all <- tokens(corpus,
                     remove_numbers = TRUE,
                     remove_punct = TRUE,
                     remove_symbols = TRUE,
                     remove_url = TRUE) %>%
  tokens_tolower() %>%
  tokens_remove(stopwords) %>%
  tokens_select(min_nchar = 4)

data_dfm <- dfm(tokens_all) %>%
  dfm_trim(min_termfreq = 5, min_docfreq = 2)

keyATM_docs <- keyATM_read(texts = data_dfm)
summary(keyATM_docs)

vars <- data.frame(year = as.numeric(df$year)) %>%
  mutate(Period = as.numeric(as.factor(as.character(year))))

keywords <- list(
  `1_Center-Periphery Topic` = c("català", "catalana", "catalanes", "catalans", "catalanisme", "catalunya", 
                                 "espanya", "espanyol", "madrid", "república", "republicana", "país", 
                                 "llengua", "llibertat", "competència", "territorial", "dret", "castellà", 
                                 "unió", "nació", "cultura", "cultural", "diàleg", "centralista", 
                                 "central", "referèndum", "independència", "independentista", "independentisme", 
                                 "constitucional", "autodeterminació", "poble", "autogovern", "autonomia", 
                                 "competencial", "transferència", "democràcia", "nacionalisme", "voluntat", 
                                 "bilingüe", "procés", "descentralització", "territorial", "drets", 
                                 "traspàs", "unitat", "respecte", "compromís", "federal", "traspàs", "nacional"), 
  
  `2_Left-Right Topic` = c("econòmica", "econòmic", "economia", "educació", "ensenyament", "serveis", 
                           "servei", "crisis", "crisi", "fiscal", "euro", "euros", "sanitat", 
                           "desigualtats", "deute", "retallades", "social", "públic", "habitatge", 
                           "pesseta", "pessetes", "impostos", "infraestructures", "inversió", 
                           "finançament", "despeses", "administració", "despesa", "pagar", 
                           "creixement", "atur", "feina", "competitivitat", "treball", "laboral", 
                           "austeritat", "pressupost", "benestar", "prosperitat", "eficient", 
                           "climàtic", "precarietat", "moralitat", "nacionalitzar", "precarització", 
                           "comerç", "agricultura", "agrària", "reconversió", "reindustrialització", 
                           "competència", "disminuït", "globalitzar", "agràries", "família", 
                           "sostenibilitat", "social", "austeritat", "contaminació", "empreses", 
                           "recursos", "seguretat", "socials")
)

set.seed(575)

out_dyn <- keyATM(
  docs = keyATM_docs,
  no_keyword_topics = 0,
  keywords = keywords,
  model = "dynamic",
  model_settings = list(time_index = vars$Period, num_states = 12)
)

TableA1 <- top_words(out_dyn, 50)

fig_timetrend <- plot_timetrend(out_dyn,
                                time_index_label = vars$Period,
                                xlab = "Year", show_point = TRUE)
df_plot <- fig_timetrend$values

x_axis_labels <- c("1980","1984","1988","1992","1995","1999",
                   "2003","2006","2010","2012","2016","2018")

FigureA1 <- ggplot(df_plot, aes(x = time_index, y = Proportion, group = Topic)) +
  geom_line(aes(color = Topic), linewidth = 1.2) +
  geom_point(color = "black") +
  scale_x_continuous(breaks = seq_along(x_axis_labels),
                     labels = x_axis_labels) +
  labs(x = "Year", y = "Mean of topic proportion (θ)") +
  theme_minimal() +
  theme(legend.position = "none") +
  geom_text(x = 6, y = 0.35,
            label = "Left-right", color = "dodgerblue3",
            hjust = -0.1, vjust = 0.5, size = 4) +
  geom_text(x = 6, y = 0.65,
            label = "Center-periphery", color = "firebrick1",
            hjust = -0.1, vjust = -0.5, size = 4)


print(TableA1)
print(FigureA1)


# ---------------------------------------------------------------------------------------------
#Note: Results are stable across repeated runs on the same computer when the random seed is fixed.
#However, small numerical differences may arise across different computers or software environments 
#due to variation in random number generators and linear algebra libraries. These differences do not 
#affect the substantive interpretation of the results.
#-----------------------------------------------------------------------------------------------

